/**
 * @用途 浏览器式应用主进程
 * @author 黄敏
 * @创建时间 2024-03-21
 **/
import '#/global'
import { databaseManager } from '#/database/database-manager'
import { registerBrowsingHistoryHandlers } from '#/modules/ipc-browsing-history'
import { registerSiteInfoHandlers } from '#/modules/ipc-site-info'
import { registerPasswordManagerHandlers } from '#/modules/ipc-password-manager'
import { registerAsyncTaskHandlers } from '#/modules/ipc-async-task'
import { registerBookmarkManagerHandlers } from '#/modules/ipc-bookmark-manager'

import headerRules from '#/network/header-rules.config'
import { registerHttpHeaderInterceptors } from '#/network/http-interceptor'
import { setupGenericContextMenuHandlers } from '#/modules/menu-generic'

import * as Sentry from '@sentry/electron/main'
import { app, clipboard, net, powerMonitor } from 'electron'
import { PERFORMANCE_CONFIG } from '~shared/constants'
import '#/browser'
import 'global-state'
import '#/modules/process-manager'
import '#/modules/id-generator'
import '#/shortcuts'
import '#/updater'
import { registerAiHandlers } from '#/modules/ipc-ai'

import { registerNotificationIpcHandlers } from '#/modules/ipc-notifications'

console.log('process.env', process.env)

/**
 * 初始化Sentry错误监控
 * 只在非开发环境中启用
 */
function initializeSentry(): void {
  const environment = process.env.NODE_ENV
  const version = process.env.npm_package_version
  const isProduction = environment === 'production'

  // console.log(`环境: ${environment}`)
  //
  // console.log(`SENTRY_DSN: ${process.env.SENTRY_DSN ? '已设置' : '未设置'}`)

  if (environment === 'development') {
    console.log('开发环境中已禁用 Sentry (主进程)')
    return
  }

  if (!process.env.SENTRY_DSN) {
    console.warn('未找到 SENTRY_DSN，Sentry 将不会初始化')
    return
  }

  Sentry.init({
    dsn: process.env.SENTRY_DSN,
    environment,
    ipcMode: Sentry.IPCMode.Protocol,
    // Disable SDK preload injection to avoid duplicate preload execution
    getSessions: () => [],
    release: `field-flint@${version}`,
    sendDefaultPii: true,
    tracesSampleRate: isProduction
      ? PERFORMANCE_CONFIG.SENTRY_PRODUCTION_SAMPLE_RATE
      : PERFORMANCE_CONFIG.SENTRY_DEVELOPMENT_SAMPLE_RATE,
    debug: !isProduction,
    beforeSend(event) {
      if (!isProduction) {
        console.error('Sentry 事件:', event)
      }
      return event
    }
  })

  console.log(`Sentry 已在 ${environment} 环境中初始化`)
}

console.log('正在初始化 Sentry....')
// 初始化Sentry
initializeSentry()

// 简单的全局错误处理 - 确保错误能在控制台显示
process.on('uncaughtException', error => {
  console.error('❌ 未捕获的异常:', error.message)
  console.error('堆栈信息:', error.stack)
})

process.on('unhandledRejection', reason => {
  console.error('❌ 未处理的 Promise 拒绝:', reason)
})

// 禁用安全警告
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'

// E2E 环境下：在主进程将部分 Electron 能力挂载到 global，便于 Playwright 通过 electronApp.evaluate 访问
if (process.env.E2E === 'true') {
  ;(global as any).e2eClipboard = clipboard
  ;(global as any).e2eNet = net
}

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 应用退出前清理资源
app.on('before-quit', async () => {
  console.log('🔄 应用即将退出，正在清理资源...')
  try {
    await databaseManager.shutdown()
  } catch (error) {
    console.error('❌ 关闭数据库管理器时发生错误:', error)
  }
})

// 创建窗口管理器实例（使用单例模式）
app.whenReady().then(() => {
  // 初始化数据库管理器
  databaseManager
    .initialize()
    .then(() => {
      console.log('✅ 主进程数据库管理器初始化成功')
    })
    .catch(() => {
      console.error('❌ 主进程数据库管理器初始化失败')
    })
  // 注册IPC处理器（在数据库初始化完成后）
  registerSiteInfoHandlers()
  registerBrowsingHistoryHandlers()
  registerBookmarkManagerHandlers()

  registerPasswordManagerHandlers()
  registerAsyncTaskHandlers()
  registerAiHandlers()

  // 注册通知窗口 IPC 处理器（全局应用级通知）
  registerNotificationIpcHandlers()

  // 初始化通用右键菜单处理器
  setupGenericContextMenuHandlers()

  // 监控系统挂起/恢复事件
  powerMonitor.on('suspend', () => {
    console.log('系统挂起，应用可能会暂停')
  })

  // 注册网络头部拦截器（静态规则，注册一次）
  try {
    registerHttpHeaderInterceptors(headerRules)
    console.log('✅ HTTP 请求/响应头拦截器已注册')
  } catch (error) {
    console.error('❌ 注册 HTTP 拦截器失败：', error)
  }

  powerMonitor.on('resume', () => {
    console.log('系统恢复，应用将继续运行')
    // 可能需要刷新某些资源
  })
})
